package jp.co.toshiba.ffsa.service.common;

import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;

import jp.co.toshiba.ffsa.entity.OperationHistory;
import jp.co.toshiba.ffsa.entity.System;
import jp.co.toshiba.ffsa.entity.User;

import org.apache.log4j.Logger;
import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.extension.jdbc.where.SimpleWhere;
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar.mai.mail.MailAddress;

/**
 * 共通系ビジネスロジック
 * @author npc
 */
public class CommonService {
    /**
     * 例外エラー時のログを出力する
     * @param errorContents ログ出力内容
     */
    public void errorLogWriter(String errorContents){
        // ログレベルFATALで書き込む
        // 設定したレベルと内容でログを書き込む。
        Logger logger = Logger.getLogger("FATAL");
        logger.fatal(errorContents);
    }

    public void entryOperationHistory(String userID, String ipAddress, String sessionID, String screenID, String operation, String result, String parameter) throws Exception{
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{

            // 当日取得
            Calendar cal = Calendar.getInstance();
            OperationHistory opehis = new OperationHistory();

            opehis.operationTime = new Timestamp(cal.getTime().getTime());
            opehis.userId        = userID;
            opehis.ipAddress     = ipAddress;
            opehis.sessionId     = sessionID;
            opehis.screenId      = screenID;
            opehis.operation     = operation;
            opehis.result        = Short.valueOf(result);
            opehis.parameter     = parameter;
            opehis.createdAt     = new Timestamp(cal.getTime().getTime());
            opehis.createdBy     = userID;
            opehis.updatedAt     = new Timestamp(cal.getTime().getTime());
            opehis.updatedBy     = userID;

            // 更新
            jdbcManager.insert(opehis).execute();
            return;
        }catch(Exception e){
            throw e;
        }
    }

    /**
     * ユーザ情報を取得する
     * @param userId ユーザID
     * @return ユーザ情報
     * @throws Exception
     */
    public User getUserInfo(String userId) throws Exception {

        // S2Container初期化
        SingletonS2ContainerFactory.init();

        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);

        try{
            // 検索条件
            SimpleWhere swh = new SimpleWhere().eq("userId", userId)
                                               .eq("deleteFlag", "0")
                                               ;

            // ユーザ情報取得
            User user = jdbcManager.from(User.class)
                                   .where(swh)
                                   .getSingleResult()
                                   ;

            return user;

        }catch(Exception e){
            throw e;
        }
    }

    /**
     * パスワード変更警告を表示する期限をシステムマスタから取得する
     * @return 期限(日数)
     * @throws Exception
     */
    public String getPasswordChangeTerm() throws Exception{

        // S2Container初期化
        SingletonS2ContainerFactory.init();

        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);

        try{
            // 検索条件
            SimpleWhere swh = new SimpleWhere().eq("systemId1", "pw_term")
                                               .eq("deleteFlag", "0");
            // 一覧取得
            System system = jdbcManager.from(System.class)
                                       .where(swh)
                                       .getSingleResult()
                                       ;
            if(system != null){
                return system.value1;
            }else{
                return "180";
            }
        }catch(Exception e){
            throw e;
        }
    }

    /**
     * 対象ユーザーに属する地域の管理者を取得する
     * @return
     * @throws Exception
     */
    public MailAddress[] getRegionAdministrator(String region) throws Exception {
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            MailAddress[] mailAddress = null;
            SimpleWhere swh = new SimpleWhere().eq("region", region)
                    .eq("authority", ConstantValue.authorityAdministrator)
                    .eq("deleteFlag", ConstantValue.deleteFlagEnabled)
                    .eq("mailReceptionRefuseFlag", ConstantValue.mailReceptionRefuseFlagNotDenial);

            //URL引数と一致するデータを取得
            List<User> userList = jdbcManager.from(User.class)
                    .where(swh)
                    .getResultList();

            //データが存在する場合
            if(userList != null && userList.size() > 0){
                mailAddress = new MailAddress[userList.size()];
                for(int i=0; i<userList.size(); i++){
                    mailAddress[i] = new MailAddress(userList.get(i).mailAddress,"");
                }
            }else{
                mailAddress = this.getRegionSuperUser();
            }
            return mailAddress;
        }catch(Exception e){
            throw e;
        }
    }

    /**
     * 本部管理者全員のメールアドレスを取得する
     * @return
     * @throws Exception
     */
    public MailAddress[] getRegionSuperUser() throws Exception {
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            MailAddress[] mailAddress = null;
            SimpleWhere swh = new SimpleWhere()
                    .eq("authority", ConstantValue.authoritySuperUser)
                    .eq("deleteFlag", ConstantValue.deleteFlagEnabled);

            // データを取得
            List<User> userList = jdbcManager.from(User.class)
                    .where(swh)
                    .getResultList();

            //データが存在する場合
            if(userList != null && userList.size() > 0){
                mailAddress = new MailAddress[userList.size()];
                for(int i=0; i<userList.size(); i++){
                    mailAddress[i] = new MailAddress(userList.get(i).mailAddress,"");
                }
            }else{
                return null;
            }
            return mailAddress;
        }catch(Exception e){
            throw e;
        }
    }

    /**
     * 管理者全員のメールアドレスを取得する
     * (地域の管理者,本部管理者全員)
     * @return
     * @throws Exception
     */
    public MailAddress[] getAdministratorAndSuperUserMailaddress(String region) throws Exception {
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            MailAddress[] mailAddressAdministrator = null; // 対象ユーザーに属する地域の管理者のメールアドレス
            MailAddress[] mailAddressSuperUser     = null; // 本部管理者全員のメールアドレス
            MailAddress[] mailAddressAll           = null; // 管理者全員のメールアドレス

            SimpleWhere swh = new SimpleWhere().eq("region", region)
                                               .eq("authority", ConstantValue.authorityAdministrator)
                                               .eq("deleteFlag", ConstantValue.deleteFlagEnabled)
                                               .eq("mailReceptionRefuseFlag", ConstantValue.mailReceptionRefuseFlagNotDenial);

            //URL引数と一致するデータを取得
            List<User> userList = jdbcManager.from(User.class)
                                             .where(swh)
                                             .getResultList();

            //データが存在する場合
            if( (userList != null && userList.size() > 0) || (mailAddressSuperUser != null && mailAddressSuperUser.length > 0) ){
                mailAddressAdministrator = new MailAddress[userList.size()];
                mailAddressSuperUser     = this.getRegionSuperUser();
                mailAddressAll           = new MailAddress[mailAddressAdministrator.length + mailAddressSuperUser.length];

                // 象ユーザーに属する地域の管理者のメールアドレス
                for(int i=0; i<userList.size(); i++){
                    mailAddressAll[i] = new MailAddress(userList.get(i).mailAddress,"");
                }

                //本部管理者全員のメールアドレス
                int count = 0;
                for (int i = mailAddressAdministrator.length; i < mailAddressAll.length; i++) {
                    mailAddressAll[i] = mailAddressSuperUser[count];
                    count++;
                }

            }else{
                // 象ユーザーに属する地域の管理者がない場合、本部管理者全員のメールアドレス取得
                mailAddressAll = this.getRegionSuperUser();
            }

            return mailAddressAll;
        }catch(Exception e){
            throw e;
        }
    }

}